/**************************************************************************************************
**                                                                                               **
**  文件名称:  app_task_lcd.h                                                                    **
**  版权所有:  CopyRight @ Xiamen Yaxon NetWork CO.LTD. 2017                                     **
**  文件描述:  LCD任务测试模块                                                                   **
**  ===========================================================================================  **
**  创建信息:  | 2018-7-13 | LEON | 创建本模块                                                   **
**  ===========================================================================================  **
**  修改信息:  单击此处添加....                                                                  **
**************************************************************************************************/
#include "app_include.h"
#include "app_task_lcd.h"

/*************************************************************************************************/
//                           模块宏定义
/*************************************************************************************************/
#define LCD_TASK_PRIO        4                                                 /* 任务优先级 */
#define LCD_STK_SIZE         128                                               /* 任务堆栈大小 */

/*************************************************************************************************/
//                           区域结构体定义
/*************************************************************************************************/
typedef struct {
    INT16U    xpos;                                                            /* X轴坐标 */
    INT16U    ypos;                                                            /* Y轴坐标 */
    INT16U    width;                                                           /* 区域宽度 */
    INT16U    height;                                                          /* 区域高度 */
} AREA_T;

/*************************************************************************************************/
//                           静态变量定义
/*************************************************************************************************/
static OS_TCB  LCDTaskTCB;                                                     /* 任务控制块 */
static CPU_STK LCD_TASK_STK[LCD_STK_SIZE];                                     /* 任务堆栈 */

static AREA_T         s_blue   = {  0, 280,  40,  40};
static AREA_T         s_red    = { 40, 280,  40,  40};
static AREA_T         s_green  = { 80, 280,  40,  40};
static AREA_T         s_black  = {120, 280,  40,  40};
static AREA_T         s_magent = {160, 280,  40,  40};
static AREA_T         s_cyan   = {200, 280,  40,  40};
static AREA_T         s_valid  = {  5,  20, 230, 265};


/**************************************************************************************************
**  函数名称:  IsInRectangle
**  功能描述:  判断一个点是否落在矩形区域内
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
static BOOLEAN IsInRectangle(TP_STATE *pos, AREA_T *area)
{
    if (pos->X < area->xpos) {
        return FALSE;
    }

    if (pos->X > (area->xpos + area->width)) {
        return FALSE;
    }

    if (pos->Y < area->ypos) {
        return FALSE;
    }

    if (pos->Y > (area->ypos + area->height)) {
        return FALSE;
    }
    
    return TRUE;
}

/**************************************************************************************************
**  函数名称:  TouchPannelTest
**  功能描述:  触摸屏及LCD显示屏测试函数
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
static void TouchPannelTest(void)
{
    TP_STATE *TP_State;
    
    TP_State = IOE_TP_GetState();
        
    if (TP_State->TouchDetected == FALSE) {
        return;
    }
    
    if (IsInRectangle(TP_State, &s_blue) == TRUE) {
        #if DEBUG_COMM > 0
        Debug_SysPrint("blue is set\r\n");
        #endif
        DAL_LCD_SetTextColor(LCD_COLOR_BLUE);
        return;
    }
    
    if (IsInRectangle(TP_State, &s_red) == TRUE) {
        #if DEBUG_COMM > 0
        Debug_SysPrint("red is set\r\n");
        #endif
        DAL_LCD_SetTextColor(LCD_COLOR_RED);
        return;
    }
    
    if (IsInRectangle(TP_State, &s_green) == TRUE) {
        #if DEBUG_COMM > 0
        Debug_SysPrint("green is set\r\n");
        #endif
        DAL_LCD_SetTextColor(LCD_COLOR_GREEN);
        return;
    }
    
    if (IsInRectangle(TP_State, &s_black) == TRUE) {
        #if DEBUG_COMM > 0
        Debug_SysPrint("black is set\r\n");
        #endif
        DAL_LCD_SetTextColor(LCD_COLOR_BLACK);
        return;
    }
    
    if (IsInRectangle(TP_State, &s_magent) == TRUE) {
        #if DEBUG_COMM > 0
        Debug_SysPrint("magenta is set\r\n");
        #endif
        DAL_LCD_SetTextColor(LCD_COLOR_MAGENTA);
        return;
    }
    
    if (IsInRectangle(TP_State, &s_cyan) == TRUE) {
        #if DEBUG_COMM > 0
        Debug_SysPrint("cyan is set\r\n");
        #endif
        DAL_LCD_SetTextColor(LCD_COLOR_CYAN);
        return;
    }

    if (IsInRectangle(TP_State, &s_valid) == TRUE) {
        DAL_LCD_DrawFullCircle(TP_State->X, TP_State->Y, 3);
    }
}

/**************************************************************************************************
**  函数名称:  LCDDisplay_Init
**  功能描述:  LCD显示屏初始化
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
static void LCDDisplay_Init(void)
{
    DAL_LCD_Clear(LCD_COLOR_WHITE);

    if (IOE_Config() == IOE_OK) {
        DAL_LCD_SetTextColor(LCD_COLOR_BLUE); 
        DAL_LCD_DrawFullRect(s_blue.xpos, s_blue.ypos, s_blue.width, s_blue.height);
        DAL_LCD_SetTextColor(LCD_COLOR_RED); 
        DAL_LCD_DrawFullRect(s_red.xpos, s_red.ypos, s_red.width, s_red.height);
        DAL_LCD_SetTextColor(LCD_COLOR_GREEN); 
        DAL_LCD_DrawFullRect(s_green.xpos, s_green.ypos, s_green.width, s_green.height);
        DAL_LCD_SetTextColor(LCD_COLOR_BLACK); 
        DAL_LCD_DrawFullRect(s_black.xpos, s_black.ypos, s_black.width, s_black.height);
        DAL_LCD_SetTextColor(LCD_COLOR_MAGENTA); 
        DAL_LCD_DrawFullRect(s_magent.xpos, s_magent.ypos, s_magent.width, s_magent.height);
        DAL_LCD_SetTextColor(LCD_COLOR_CYAN); 
        DAL_LCD_DrawFullRect(s_cyan.xpos, s_cyan.ypos, s_cyan.width, s_cyan.height);
        DAL_LCD_SetTextColor(LCD_COLOR_BLACK);
    } else {
        DAL_LCD_Clear(LCD_COLOR_RED);
        DAL_LCD_SetTextColor(LCD_COLOR_BLACK); 
        DAL_LCD_DisplayStringLine(LCD_LINE_6, (INT8U *)"   IOE NOT OK     ");
        DAL_LCD_DisplayStringLine(LCD_LINE_7, (INT8U *)"Reset the board   ");
        DAL_LCD_DisplayStringLine(LCD_LINE_8, (INT8U *)"and try again     ");
    }
}

/**************************************************************************************************
**  函数名称:  LCDTask
**  功能描述:  LCD任务的实际执行函数
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
static void LCDTask(void *p_arg)
{
    OS_ERR err;
    
    p_arg = p_arg;
    
    LCDDisplay_Init();
    
    while (1) {
        TouchPannelTest();
        OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_HMSM_STRICT, &err);
    }
}

/**************************************************************************************************
**  函数名称:  CreateLCDTask
**  功能描述:  创建LCD任务
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void CreateLCDTask(void)
{
    OS_ERR err;
   
    OSTaskCreate((OS_TCB    * )&LCDTaskTCB,
                 (CPU_CHAR  * )"LCDTask",
                 (OS_TASK_PTR )LCDTask,
                 (void      * )0,
                 (OS_PRIO     )LCD_TASK_PRIO,
                 (CPU_STK   * )&LCD_TASK_STK[0],
                 (CPU_STK_SIZE)LCD_STK_SIZE / 10, 
                 (CPU_STK_SIZE)LCD_STK_SIZE,
                 (OS_MSG_QTY  )0,
                 (OS_TICK     )0,
                 (void      * )0,
                 (OS_OPT      )OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_SAVE_FP,
                 (OS_ERR    * )&err);
}


